
#include "drv_uart.h"
#define UART1_BAUDRATE				115200
#include "misc.h"
#pragma import(__use_no_semihosting)               
// 使用标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;      
// _sys_exit()用于避免使用半主机模式
void _sys_exit(int x) 
{ 
	x = x; 
} 

// 重构fputc 
int fputc(int ch, FILE *f)
{ 	
	while((USART3->SR&0X40)==0);	// 等待发送完成
	USART3->DR = (uint8_t) ch;      
	return ch;
}

void UART_Config(void)
{
  	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef   NVIC_InitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	// 使能GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	// 使能USART1的时钟

	// 配置USART1的复用功能引脚
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); // GPIOA9复用成USART1的TX
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);// GPIOA10复用成USART1的RX
	
	// USART1对应的GPIO参数的配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // GPIOA9、GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;			// 复用模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;		// 输出速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 			// 输出类型设置为推挽输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 			// 引脚配置为上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
   	// USART1工作参数初始化
	USART_InitStructure.USART_BaudRate = UART1_BAUDRATE;		// 波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	// 8个数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;		// 1个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;			// 不使用奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流控
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	// 使能收发模式
  	USART_Init(USART1, &USART_InitStructure); 
	

		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	//	USART_ITConfig(USART3,USART_IT_TXE,ENABLE);
		NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
		NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_Init(&NVIC_InitStruct);
		USART_Cmd(USART1,ENABLE);
	USART_ClearFlag(USART1,USART_FLAG_TC);					// 清发送完成标志位
	
  	USART_Cmd(USART1, ENABLE);  							// 使能USART1 
}
void Usart2_Config(void)
{
	USART_InitTypeDef  USART_InitStruct;
	GPIO_InitTypeDef   GPIO_InitStruct;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
	USART_InitStruct.USART_BaudRate = 9600;
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength  = USART_WordLength_8b;
	USART_Init(USART2,&USART_InitStruct);


	//	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

	
		USART_Cmd(USART2,ENABLE);

}

void Usart3_Config(void)
{
	USART_InitTypeDef  USART_InitStruct;
	GPIO_InitTypeDef   GPIO_InitStruct;
	NVIC_InitTypeDef   NVIC_InitStruct;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStruct);

	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength  = USART_WordLength_8b;
	
USART_Init(USART3,&USART_InitStruct);


		USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
		//USART_ITConfig(USART3,USART_IT_ERR,ENABLE);
		NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;
		NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_Init(&NVIC_InitStruct);
	USART_ClearFlag(USART2,USART_FLAG_TC);	
		USART_Cmd(USART3,ENABLE);
}

void UART5_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	USART_InitTypeDef  USART_InitStruct;
//	NVIC_InitTypeDef  NVIC_InitStruct;

	RCC_APB1PeriphClockCmd( RCC_APB1Periph_UART5, ENABLE);
	RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOD, ENABLE);


	GPIO_InitStruct.GPIO_Mode		=GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType		=GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin		=GPIO_Pin_12;
	GPIO_InitStruct.GPIO_PuPd		=GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed		=GPIO_Speed_50MHz;
	GPIO_Init( GPIOC, & GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode		=GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType		=GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin		=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_PuPd		=GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed		=GPIO_Speed_50MHz;
	GPIO_Init( GPIOD, & GPIO_InitStruct);

	GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_UART5);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_UART5);

	USART_InitStruct.USART_BaudRate				=115200;
	USART_InitStruct.USART_HardwareFlowControl	=USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode					=USART_Mode_Rx|USART_Mode_Tx;
	USART_InitStruct.USART_Parity				=USART_Parity_No;
	USART_InitStruct.USART_StopBits				=USART_StopBits_1;
	USART_InitStruct.USART_WordLength			=USART_WordLength_8b;
	USART_Init( UART5, & USART_InitStruct);

//	NVIC_InitStruct.NVIC_IRQChannel						=UART5_IRQn;
//	NVIC_InitStruct.NVIC_IRQChannelCmd					=ENABLE;
//	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	=1;
//	NVIC_InitStruct.NVIC_IRQChannelSubPriority			=8;
//	NVIC_Init(& NVIC_InitStruct);

	USART_ITConfig( UART5,  USART_IT_RXNE, ENABLE);
	USART_Cmd(UART5,ENABLE);
	USART_ClearFlag(UART5,USART_FLAG_TC);


	
}



